Mediator & Event

C++에서는 언어 차원에서의 이벤트 기능을 제공하지 않는다.
(C# 등의 일부언어는 지원한다. C++에서 이벤트 처리를 위해 C의 시스템 차원 시스템콜 사용)

Boost.Signals2 라이브러리
Boost.Signals2는 이벤트 활용에 필수적인 기능등을 제공한다.
이벤트를 시그널(알림을 발생시키는 객체), 수신처를 슬롯(알림을 처리하는 함수)라고 부름
struct EventData{
virtual ~EventData()=default;
virtual void print() const =0;
};
struct PlayerScoredData: EventData{
string player_name;
int goals_scored_so_far;
PlayerScoredData(const string& player_name, const int goals_scored_so_far): player_name(player_name), goals_scored_so_far(goals_scored_so_far) {}
void print() const override {
cout<<player_name<<" has scored! (their "<<goals_scored_so_far<" goal)"<<'\n';
}
};
//
struct Game{
signal<void(EventData*)> events; //
};
//
struct Player{
string name;
int goals_scored=0;
Game& game;
Player(const string& name, Game& game): name(name), game(game) {}
void score() {
goals_scored++;
PlayerScoredData ps{name, goals_scored};
game.events(&ps); //
}
};
//
struct Coach{
Game& game;
explicit Coach(Game& game): game(game) {
game.events.connect([](EventData* e){
PlayerScoredData* ps=dynamic_cast<PlayerScoredData*>(e);
if(ps && ps->goals_scored_so_far<3){
cout<<"coach says: well done, "<<ps->player_name<<'\n';
}
});
}
};
//
Game game;
Player player{"Sam", game};
Coach coach{game};
player.score();
player.score();
player.score();
매개자 디자인 패턴은 시스템 내 컴포넌트 모두가 참조할 수 있는 중간자를 컴포넌트 간에 서로
직접적으로 참조하지 않고도 커뮤니케이션 할 수 있게 함을 기본 아이디어로 한다.

매개자를 통해 직접적인 메모리 접근 대신 식별자(이름, 번호, 경로 등)로 커뮤니케이션 할 수 있게 한다.

매개자에 멤버 변수로 리스트를 두고 리스트를 검사하여 필요한 항목만 선택적으로 처리하는 함수를 구현